﻿using System;

namespace RabbitMQExtension
{
    /// <summary>
    /// 生产者客户端接口
    /// </summary>
    public interface IMQProducerClient : IDisposable
    {
        ILog Log { get; set; }

        /// <summary>
        /// 设置连接信息
        /// </summary>
        /// <param name="config">连接信息</param>
        void SetConnectInfo(MQConfig config);

        /// <summary>
        /// 发送 发布/订阅 模式的消息到服务器
        /// </summary>
        /// <param name="topic">消息主题</param>
        /// <param name="message">消息内容</param>
        /// <param name="msgId">消息唯一Id</param>
        /// <returns></returns>
        MQSendResult SendPubSubMessage(string topic, string message, string msgId);

        /// <summary>
        /// 发送 主题 模式的消息到服务器
        /// </summary>
        /// <param name="topic">消息主题</param>
        /// <param name="message">消息内容</param>
        /// <param name="msgId">消息唯一Id</param>
        /// <returns></returns>
        MQSendResult SendTopicMessage(string topic, string filterExpress, string message, string msgId);

        /// <summary>
        /// 发送 消息 到队列，直接发送模式，队列不存在 不会创建队列，不会异常
        /// </summary>
        /// <param name="queue">队列名</param>
        /// <param name="message">消息内容</param>
        /// <param name="msgId">消息唯一Id</param>
        /// <returns><see cref="MQSendResult"/>。</returns>
        MQSendResult SendDirectMessage(string queue, string message, string msgId);

        /// <summary>
        /// 关闭所有连接，停止接收消息。
        /// </summary>
        void Shutdown();

        /// <summary>
        /// 与服务器是否处于连接状态。
        /// </summary>
        /// <returns>true:已连接，false:未连接。</returns>
        bool IsConnected();
    }

    /// <summary>
    /// 消息发送结果。
    /// </summary>
    public class MQSendResult
    {
        public MQSendResult(string msgId, bool sucess = true, string exceptionInfo = "")
        {
            MessageId = msgId;
            Sucess = sucess;
            ExceptionInfo = exceptionInfo;
        }

        public string MessageId
        {
            get;
            internal set;
        }

        public bool Sucess
        {
            get;
            internal set;
        }
        public string ExceptionInfo
        {
            get;
            internal set;
        }
    }
}
